package org.dromara.hm.service;

import org.dromara.hm.domain.HmCustomerTransferHistory;
import org.dromara.hm.domain.bo.HmCustomerBatchTransferBo;
import org.dromara.hm.domain.vo.HmCustomerVo;
import org.dromara.hm.domain.bo.HmCustomerBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.hm.domain.vo.HmPurchaseVo;
import org.dromara.hm.domain.vo.HmStaffTransferVo;
import org.dromara.system.domain.vo.SysUserVo;

import java.util.Collection;
import java.util.List;

/**
 * 客户信息Service接口
 *
 * @author zy Hu
 * @date 2024-12-15
 */
public interface IHmCustomerService {

    /**
     * 查询客户信息
     *
     * @param customerId 主键
     * @return 客户信息
     */
    HmCustomerVo queryById(Long customerId);

    /**
     * 分页查询客户信息列表
     *
     * @param bo        查询条件
     * @param pageQuery 分页参数
     * @return 客户信息分页列表
     */
    TableDataInfo<HmCustomerVo> queryPageList(HmCustomerBo bo, PageQuery pageQuery);

    /**
     * 查询符合条件的客户信息列表
     *
     * @param bo 查询条件
     * @return 客户信息列表
     */
    List<HmCustomerVo> queryList(HmCustomerBo bo);

    /**
     * 新增客户信息
     *
     * @param bo 客户信息
     * @return 是否新增成功
     */
    Boolean insertByBo(HmCustomerBo bo);

    /**
     * 修改客户信息
     *
     * @param bo 客户信息
     * @return 是否修改成功
     */
    Boolean updateByBo(HmCustomerBo bo);

    /**
     * 修改客户信息
     *
     * @param bo 客户信息
     * @return 是否修改成功
     */
    Boolean updateFamily(HmCustomerBo bo);

    /**
     * 校验并批量删除客户信息信息
     *
     * @param ids     待删除的主键集合
     * @param isValid 是否进行有效性校验
     * @return 是否删除成功
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);

    HmCustomerVo selectUserByCustomerName(String phone,String customerName);

    /**
     *  根据服务人员ID查询名下所有的客户信息
     * @param staffId
     * @return
     */
    List<HmCustomerVo> queryListByStaffId(Long staffId);

    /**
     * 未分配家庭组的客户列表
     *
     * @param customer
     * @param pageQuery
     *
     * @return
     */
    TableDataInfo<HmCustomerVo> selectUnallocatedList(HmCustomerBo customer, PageQuery pageQuery);

    /**
     * 分配家庭组的客户列表
     *
     * @param customer
     * @param pageQuery
     *
     * @return
     */
    TableDataInfo<HmCustomerVo> selectLocatedList(HmCustomerBo customer, PageQuery pageQuery);

    /**
     * 根据客户id查询购买记录
     *
     * @param customerId 客户id
     *
     * @return 购买记录列表
     */
    HmPurchaseVo queryPurchaseRecordList(Long customerId,PageQuery pageQuery);

    List<HmCustomerVo> queryListByStaffIds(Long[] staffId);

    /**
     * 批量转移客户
     * @param bo 转移请求参数
     * @return 是否成功
     */
    boolean batchTransferCustomers(HmCustomerBatchTransferBo bo);

    List<HmCustomerVo> queryListByIds(List<Long> customerIds); // For fetching multiple customers

    HmStaffTransferVo resignedStaffCustomersList(Long storeId);

    /**
     * 认领公池客户。
     *
     * @param customerId 要认领的客户ID
     * @param newStaffId 认领客户的销售人员ID
     * @return 是否认领成功
     */
    Boolean claimPublicCustomer(Long customerId, Long newStaffId);

    /**
     * (Internal method) 新增客户转移历史，供定时任务或内部调用。
     * @param history 客户转移历史实体
     * @return 是否新增成功
     */
    Boolean insert(HmCustomerTransferHistory history);
}
